/**
 * 强制转换为字符串函数
 * @param {any} value - 需要转换的值
 * @returns {string} 转换后的字符串，如果为空则返回空字符串
 */

export function toString(value) {

  // 处理 null 和 undefined
  if (value === null || value === undefined) {
    return '';
  }

  // 处理数字、布尔值等基本类型
  if (typeof value !== 'object') {
    return String(value);
  }

  // 处理数组和对象
  try {
    // 如果是空数组或空对象，返回空字符串
    if (Array.isArray(value) && value.length === 0) {
      return '';
    }
    if (Object.keys(value).length === 0) {
      return '';
    }

    // 使用 JSON.stringify 转换对象和数组
    return JSON.stringify(value);
  } catch (error) {
    // 如果转换失败，返回空字符串
    return '';
  }
}


/**
 * 判断值是否为空
 * @param {*} val 任意类型的值
 * @returns {boolean} true 表示空
 */
export function isEmpty(val) {
	// null 或 undefined
	if (val === null || val === undefined) return true

	// 去掉前后空格的空字符串
	if (typeof val === 'string' && val.trim() === '') return true

	// 空数组
	if (Array.isArray(val) && val.length === 0) return true

	// 空对象（排除数组和 null）
	if (typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length === 0) return true

	return false
}

/**
 * 检查对象是否有空值
 * @param {*} val 任意类型的值
 * @returns {boolean|string}
 */
export function checkEmptyProperties(obj) {
	for (const [key, value] of Object.entries(obj)) {
		if (isEmpty(value)) {
			return key
		}

	}
	return false;
}

/**
 * 合并对象
 * @param {Object} defaults
 * @param {Object} overrides
 */
export function mergeProps(defaults, overrides) {
  const result = { ...defaults }

  for (const key in overrides) {
    if (
      overrides[key] &&
      typeof overrides[key] === 'object' &&
      !Array.isArray(overrides[key])
    ) {
      // 如果是对象，递归合并
      result[key] = mergeProps(defaults[key] || {}, overrides[key])
    } else {
      // 否则直接覆盖
      result[key] = overrides[key]
    }
  }

  return result
}
